package service;

import entity.SalaryStandardChange;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 薪酬标准变更服务接口
 * 定义了薪酬标准变更相关的业务方法
 */
public interface SalaryStandardChangeService {
    
    /**
     * 创建薪酬标准变更记录
     * @param standardId 薪酬标准ID
     * @param changes 变更内容，字段名和新值的映射
     * @param createUserId 创建人ID
     * @return 创建的变更记录ID
     * @throws IllegalArgumentException 如果参数无效
     */
    Long createSalaryStandardChange(Long standardId, Map<String, Object> changes, Long createUserId);
    
    /**
     * 审核薪酬标准变更
     * @param changeId 变更记录ID
     * @param approved 是否通过
     * @param reviewUserId 审核人ID
     * @throws IllegalArgumentException 如果参数无效或变更记录不存在
     */
    void reviewSalaryStandardChange(Long changeId, boolean approved, Long reviewUserId);
    
    /**
     * 获取薪酬标准的所有变更记录
     * @param standardId 薪酬标准ID
     * @return 变更记录列表
     */
    List<SalaryStandardChange> findByStandardId(Long standardId);
    
    /**
     * 根据审核状态查找变更记录
     * @param reviewStatus 审核状态
     * @return 变更记录列表
     */
    List<SalaryStandardChange> findByReviewStatus(Integer reviewStatus);
    
    /**
     * 查找指定时间范围内的变更记录
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 变更记录列表
     */
    List<SalaryStandardChange> findByCreateTimeBetween(Date startDate, Date endDate);
    
    /**
     * 查找指定创建人的变更记录
     * @param createUserId 创建人ID
     * @return 变更记录列表
     */
    List<SalaryStandardChange> findByCreateUserId(Long createUserId);
    
    /**
     * 查找指定审核人的变更记录
     * @param reviewUserId 审核人ID
     * @return 变更记录列表
     */
    List<SalaryStandardChange> findByReviewUserId(Long reviewUserId);
    
    /**
     * 查找指定时间范围内的审核记录
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 审核记录列表
     */
    List<SalaryStandardChange> findByReviewTimeBetween(Date startDate, Date endDate);
    
    /**
     * 获取变更记录详细信息
     * @param changeId 变更记录ID
     * @return 变更记录的详细信息
     * @throws IllegalArgumentException 如果变更记录不存在
     */
    Map<String, Object> getSalaryStandardChangeDetails(Long changeId);
    
    /**
     * 检查审核状态是否有效
     * @param reviewStatus 审核状态
     * @return 如果状态有效返回true，否则返回false

    
    /**
     * 统计不同审核状态的记录数量
     * @param reviewStatus 审核状态
     * @return 该状态的变更记录数量
     */
    long countByReviewStatus(Integer reviewStatus);
    
    /**
     * 统计薪酬标准的变更次数
     * @param standardId 薪酬标准ID
     * @return 该薪酬标准的变更次数
     */
    long countByStandardId(Long standardId);
}
